<?php

namespace app\common\service;

use Dengje\Pxy\library\storage\Storage as StorageDriver;
use Exception;
use app\common\model\file\FileModel;
use think\helper\Str;

class UploadService
{

    /**
     * 文件上传（用户提交上传）
     * @param int $fileType 文件类型 image和video
     * @param int $groupId 分组ID
     * @return bool
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function upload($fileType = "image", $groupId = 0, $saveDir = 'uploads', $isSave = true)
    {

//        try {
        $config = [
            'default' => 'local',
            'engine' => 'local',
        ];
        // 2、执行文件上传
        $StorageDriver = new StorageDriver($config);
        $StorageDriver->setUploadFile('file');
        $fileName = $StorageDriver->getFileName();
        $fileInfo = $StorageDriver->getFileInfo();
        $ext = strtolower($fileInfo['ext']);
        
        // 根据文件类型设置不同的大小限制
        if ($fileType == 'video') {
            // 视频文件使用分片上传的大小限制
            $maxSize = config('admin.upload_slice_max_size', 5368709120); // 默认5GB
        } else {
            // 其他文件使用普通上传大小限制
            $maxSize = config('admin.upload_max_size', 52428800); // 默认50MB
        }
        
        if ($fileInfo['size'] > $maxSize) {
            throw new Exception('上传文件大小超过了最大值！' . ($fileType == 'video' ? '视频上传最大支持' . round($maxSize / 1073741824, 1) . 'GB' : '普通文件最大支持' . round($maxSize / 1048576) . 'MB'));
        }


        // 校验上传文件后缀
        if($fileType == 'image'){
            if(!in_array($ext, config('admin.file_image'))) {
                throw new Exception('不允许上传的文件类型');
            }
        } elseif ($fileType == 'video') {
            if(!in_array($ext, config('admin.file_video'))) {
                throw new Exception('不允许上传的文件类型');
            }
        }else if($fileType == 'cert'){
            $fileType = 'file';
            if(!in_array($ext, config('admin.file_cert'))) {
                throw new Exception('不允许上传的文件类型');
            }
        }else {
            throw new Exception('文件类型错误');
        }


        // 上传文件
        $saveDir = $saveDir . '/' . date('Ymd');
        if (!$StorageDriver->upload($saveDir)) {
            throw new Exception($StorageDriver->getError());
        }

        // 3、处理文件名称
        if (strlen($fileInfo['name']) > 128) {
            $name = substr($fileInfo['name'], 0, 123);
            $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name']) - 5, strlen($fileInfo['name']));
            $fileInfo['name'] = $name . $nameEnd;
        }

        $data = [
            'admin_id' => 0,
            'group_id' => $groupId,
            'storage_path' => $saveDir,
            'url' => FileService::getFileUrl($saveDir . '/' . str_replace("\\", "/", $fileName)),
            'hash' => Str::random(32),
            'origin_name' => $fileInfo['name'],
            'object_name' => $fileName,
            'media_type' => $fileType,
            'extension' => $ext,
            'mimetype' => $fileInfo['mime'],
            'filesize' => $fileInfo['size'],

        ];
        // 是否保存到数据库
        if ($isSave) {
            // 4、写入数据库中
            $file = FileModel::create($data);
           
        } 

        

        return $data;
//        } catch (Exception $e) {
//            throw new Exception($e->getMessage());
//        }
    }











}
